import sys
import os

# 将 server 目录的父目录添加到 sys.path
server_parent_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.insert(0, server_parent_dir)

import os
import pandas as pd
import threading
import time
from data_loader import DataLoader
from encryption import EncryptionHandler
from communication import Communicator
from config import DATA_DIR, FORMAT_RULES
from server.server import CentralServer

def run_participant(file_path: str, host: str = 'localhost', port: int = 5000):
    """运行参与者节点"""
    try:
        # 初始化处理器
        data_loader = DataLoader()
        encryption_handler = EncryptionHandler()
        communicator = Communicator(host, port)
        
        # 加载数据
        data = data_loader.load_data(file_path)
        print(f"已加载数据: {file_path}")
        
        # 提取元数据
        metadata = data_loader.extract_metadata(data)
        print("元数据已提取")
        
        # 生成元数据哈希
        metadata_hash = encryption_handler.hash_metadata(metadata)
        print("元数据哈希已生成")
        
        # 加密数据
        encrypted_data = encryption_handler.encrypt_data(data.to_dict())
        print("数据已加密")
        
        # 发送到服务器
        data_to_send = {
            'encrypted_data': encrypted_data,
            'metadata_hash': metadata_hash,
            'metadata': metadata
        }
        communicator.send_data(data_to_send)
        print("数据已发送到服务器")
        
    except Exception as e:
        print(f"参与者运行出错: {str(e)}")
        raise

def run_server(server):
    """运行服务器"""
    try:
        print(f"服务器启动在 {server.host}:{server.port}")
        server.start_server()
    except Exception as e:
        print(f"服务器运行出错: {str(e)}")
        raise

def main():
    # 确保数据目录存在
    os.makedirs(DATA_DIR, exist_ok=True)
    
    # 直接使用 data/ 目录下的文件（不再生成示例数据）
    participants = [
        os.path.join(DATA_DIR, "weather_data.csv"),       # 使用 weather_data.csv
        os.path.join(DATA_DIR, "weather_extended.csv"),  # 使用 weather_extended.csv
    ]
    
    # 检查文件是否存在
    for file_path in participants:
        if not os.path.exists(file_path):
            raise FileNotFoundError(f"数据文件 {file_path} 不存在！")
    
    # 创建服务器实例
    server = CentralServer(host='localhost', port=5000)
    # 启动服务器线程
    server_thread = threading.Thread(target=run_server, args=(server,))
    server_thread.daemon = True  # 设置为守护线程，主程序退出时服务器也会退出
    server_thread.start()
    
    # 等待服务器启动
    time.sleep(1)
    
    # 运行参与者
    for file_path in participants:
        participant_thread = threading.Thread(
            target=run_participant,
            args=(file_path,)
        )
        participant_thread.start()
        participant_thread.join()
    
    # 等待一段时间以确保所有数据处理完成
    time.sleep(2)
    # 调用生成报告的方法
    server.generate_final_report()
    print("\n所有数据处理完成！")

if __name__ == "__main__":
    main()